#include "qwenvl.h"
#include <QFile>
#include <QFileInfo>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QTimer>
#include <QDebug>

const QString QwenVL::API_KEY = "sk-b55b5694fb504df6bedc828783a24fda";

QwenVL::QwenVL(QObject *parent) : QObject(parent) {}

void QwenVL::analyzeImage(const QString &imagePath)
{
    // 阶段1：读取并编码图像文件
    QFile imageFile(imagePath);
    if (!imageFile.open(QIODevice::ReadOnly)) {
        emit analysisFailed("无法打开图像文件");
        return;
    }
    QByteArray base64Data = imageFile.readAll().toBase64();

    // 根据文件扩展名确定MIME类型
    QString fileExt = QFileInfo(imagePath).suffix().toLower();
    QString mimeType = (fileExt == "jpg") ? "jpeg" : fileExt; // JPEG特殊处理

    // 构建符合阿里云规范的base64头
    QString imageHeader = QString("data:image/%1;base64,%2")
                              .arg(mimeType)
                              .arg(QString(base64Data));

    // 阶段2：构建标准请求体
    QJsonObject payload;
    payload["model"] = "qwen-vl-max-latest"; // 确认模型名称

    QJsonArray messages;
    // 系统消息
    messages.append(QJsonObject{
        {"role", "system"},
        {"content", QJsonArray{
                        QJsonObject{{"type", "text"}, {"text", "你现在是一个智能老人助行车的眼睛，你所看到的一切东西，都是在你行驶过程中车前方的东西，请你分析前方是什么东西，并给老人提供解决方案，注意不要分析过长，请用简洁的语言来回答"}}
                    }}
    });
    // 用户消息
    QJsonArray userContent;
    userContent.append(QJsonObject{
        {"type", "image_url"},
        {"image_url", QJsonObject{{"url", imageHeader}}}
    });
    userContent.append(QJsonObject{
        {"type", "text"},
        {"text", "请详细描述图片中的内容和场景"}
    });
    messages.append(QJsonObject{
        {"role", "user"},
        {"content", userContent}
    });
    payload["messages"] = messages;

    // 阶段3：配置网络请求
    QNetworkRequest request(QUrl("https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions"));
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    request.setRawHeader("Authorization", QString("Bearer %1").arg(API_KEY).toUtf8());

    // 阶段4：发送请求
    QNetworkReply *reply = m_networkManager.post(request, QJsonDocument(payload).toJson());
    QTimer::singleShot(30000, reply, [=](){
        if (reply->isRunning()) reply->abort();
    });

    // 处理响应
    connect(reply, &QNetworkReply::finished, [=](){
        handleResponse(reply);
        reply->deleteLater();
    });
}

void QwenVL::handleResponse(QNetworkReply *reply)
{
    // 阶段1：基础错误检查
    if (reply->error() != QNetworkReply::NoError) {
        qDebug() << "[网络层错误]" << reply->errorString();
        emit analysisFailed(reply->errorString());
        return;
    }

    // 阶段2：完整原始数据转储
    QByteArray rawData = reply->readAll();
    // qDebug().noquote() << "\n==== 完整响应开始 ====\n"
    //                    << QString::fromUtf8(rawData)
    //                    << "\n==== 完整响应结束 ====\n";

    // 阶段3：原始数据有效性检查
    if (rawData.isEmpty()) {
        qDebug() << "错误：响应数据为空";
        emit analysisFailed("服务器返回空响应");
        return;
    }

    // 阶段4：JSON解析基础流程
    QJsonParseError parseError;
    QJsonDocument doc = QJsonDocument::fromJson(rawData, &parseError);
    if (parseError.error != QJsonParseError::NoError) {
        qDebug() << "JSON解析错误:" << parseError.errorString();
        emit analysisFailed("响应数据格式无效");
        return;
    }

    // 阶段5：直接透传完整JSON
    emit analysisCompleted(QString::fromUtf8(rawData));
}
